/*
 * Copyright© 2003-2019 浙江汇信科技有限公司, All Rights Reserved. 
 */
package com.icinfo.cloud.provider.punish.config.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.icinfo.cloud.common.security.util.UserUtil;
import com.icinfo.cloud.provider.common.constant.Constant;
import com.icinfo.cloud.provider.punish.approval.vo.NextAuditUserVo;
import com.icinfo.cloud.provider.punish.config.dto.*;
import com.icinfo.cloud.provider.punish.config.mapper.ConfigApprovalFlowAutoMapper;
import com.icinfo.cloud.provider.punish.config.mapper.ConfigDefaultApprovalPersonMapper;
import com.icinfo.cloud.provider.punish.config.mapper.ConfigDocumentApprovalFlowAutoMapper;
import com.icinfo.cloud.provider.punish.config.model.ConfigDefaultApprovalPerson;
import com.icinfo.cloud.provider.punish.config.model.ConfigDocumentApprovalFlowAuto;
import com.icinfo.cloud.provider.punish.config.service.IConfigDefaultApprovalPersonService;
import com.icinfo.cloud.provider.punish.config.vo.ConfigAllRoleInfoVo;
import com.icinfo.cloud.provider.punish.config.vo.ConfigDefaultApprovalPersonVo;
import com.icinfo.cloud.provider.punish.config.vo.ConfigDefaultUserInfo;
import com.icinfo.cloud.provider.punish.config.vo.ConfigDefaultUserInfoVo;
import com.icinfo.cloud.provider.punish.ucase.casemain.model.CaseMainInfo;
import com.icinfo.cloud.xzcf.provider.member.userinfo.dto.UserDTO;
import com.icinfo.framework.core.service.support.MyBatisServiceSupport;
import com.icinfo.framework.mybatis.mapper.entity.Example;
import com.icinfo.framework.tools.utils.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.util.ObjectUtils;

import javax.annotation.Resource;
import java.util.*;

/**
 * 描述:  config_default_approval_person 对应的Service接口实现类.<br>
 *
 * @author framework generator
 * @date 2022年12月05日
 */
@Service
public class ConfigDefaultApprovalPersonServiceImpl extends MyBatisServiceSupport implements IConfigDefaultApprovalPersonService {
    /**
     * 日志记录器
     */
    private static final Logger logger = LoggerFactory.getLogger(ConfigDefaultApprovalPersonServiceImpl.class);

    @Autowired
    private ConfigDefaultApprovalPersonMapper configDefaultApprovalPersonMapper;
    @Autowired
    private ConfigApprovalFlowAutoMapper configApprovalFlowAutoMapper;
    @Resource
    private ConfigDocumentApprovalFlowAutoMapper configDocumentApprovalFlowAutoMapper;
    /**
     * 默认审批人列表
     * @author liyafeng
     * @date 2022/12/8
      * @param request
     * @return {@link List< ConfigDefaultApprovalPerson>}
     */
    @Override
    public List<ConfigDefaultApprovalPersonVo> getConfigDefaultApprovalPersonList(ConfigDefaultApprovalPersonRequest request) {
        List<ConfigDefaultApprovalPersonVo> configDefaultApprovalPersonList=configDefaultApprovalPersonMapper.selectConfigDefaultApprovalPerson(request);
        return configDefaultApprovalPersonList;
    }
    /**
     * 保存默认审批人
     * @author liyafeng
     * @date 2022/12/8
      * @param saveDto
     * @return {@link int}
     */
    @Override
    public int saveConfigDefaultApprovalPerson(ConfigDefaultApprovalPersonSaveDto saveDto) {
        int num=0;
        UserDTO userDTO= UserUtil.getUserInfo();
        List<ConfigDefaultApprovalPersonDto> configDefaultApprovalPersonList=saveDto.getConfigDefaultApprovalPersonList();

        if(!ObjectUtils.isEmpty(configDefaultApprovalPersonList)){
            Example example=new Example(ConfigDefaultApprovalPerson.class);
            example.createCriteria().andEqualTo("orgCode",configDefaultApprovalPersonList.get(0).getOrgCode());
            List<ConfigDefaultApprovalPerson> oldConfigDefaultApprovalPersons=configDefaultApprovalPersonMapper.selectByExample(example);
            if(!ObjectUtils.isEmpty(oldConfigDefaultApprovalPersons)){
                String oldConfigType=oldConfigDefaultApprovalPersons.get(0).getConfigType();
                String newConfigType=configDefaultApprovalPersonList.get(0).getConfigType();
                //配置方式不一致 则清掉原来配置的数据
                if(!oldConfigType.equals(newConfigType)){
                    //删除原来的配置信息
                    configDefaultApprovalPersonMapper.deleteByExample(example);
                    //新增
                    num=addConfigDefaultApprovalPersonList(configDefaultApprovalPersonList,userDTO);
                    return num;
                }
            }
            for (ConfigDefaultApprovalPersonDto configDefaultApprovalPersonDto:configDefaultApprovalPersonList) {
                if(StringUtils.isBlank(configDefaultApprovalPersonDto.getId())){
                    ConfigDefaultApprovalPerson configDefaultApprovalPerson = new ConfigDefaultApprovalPerson();
                    BeanUtils.copyProperties(configDefaultApprovalPersonDto, configDefaultApprovalPerson);
                    //id为空 新增
                    configDefaultApprovalPerson.setId(StringUtils.uuid());
                    configDefaultApprovalPerson.setUpdateTime(new Date());
                    configDefaultApprovalPerson.setUpdateUserId(userDTO.getUserId().toString());
                    configDefaultApprovalPerson.setUpdateUserName(userDTO.getRealName());
                    configDefaultApprovalPerson.setApprovalDefaultConfig(JSON.toJSONString(configDefaultApprovalPersonDto.getApprovalDefaultConfig()));
                    num = configDefaultApprovalPersonMapper.insert(configDefaultApprovalPerson);
                }else{
                    //修改
                    ConfigDefaultApprovalPerson updateConfigDefaultApprovalPerson=new ConfigDefaultApprovalPerson();
                    BeanUtils.copyProperties(configDefaultApprovalPersonDto,updateConfigDefaultApprovalPerson);
                    updateConfigDefaultApprovalPerson.setUpdateTime(new Date());
                    updateConfigDefaultApprovalPerson.setApprovalDefaultConfig(JSON.toJSONString(configDefaultApprovalPersonDto.getApprovalDefaultConfig()));
                    updateConfigDefaultApprovalPerson.setUpdateUserId(userDTO.getUserId().toString());
                    updateConfigDefaultApprovalPerson.setUpdateUserName(userDTO.getRealName());
                    num=configDefaultApprovalPersonMapper.updateByPrimaryKeySelective(updateConfigDefaultApprovalPerson);
                }
            }

        }
        return num;
    }
    /**
     * 新增
     * @author liyafeng
     * @date 2022/12/16
      * @param configDefaultApprovalPersonList
     * @param userDTO
     * @return {@link int}
     */
    private int addConfigDefaultApprovalPersonList(List<ConfigDefaultApprovalPersonDto> configDefaultApprovalPersonList,UserDTO userDTO) {
        int num=0;
        for (ConfigDefaultApprovalPersonDto configDefaultApprovalPersonDto:configDefaultApprovalPersonList) {
            ConfigDefaultApprovalPerson configDefaultApprovalPerson = new ConfigDefaultApprovalPerson();
            BeanUtils.copyProperties(configDefaultApprovalPersonDto, configDefaultApprovalPerson);
            //id为空 新增
            configDefaultApprovalPerson.setId(StringUtils.uuid());
            configDefaultApprovalPerson.setUpdateTime(new Date());
            configDefaultApprovalPerson.setUpdateUserId(userDTO.getUserId().toString());
            configDefaultApprovalPerson.setUpdateUserName(userDTO.getRealName());
            configDefaultApprovalPerson.setApprovalDefaultConfig(JSON.toJSONString(configDefaultApprovalPersonDto.getApprovalDefaultConfig()));
            num = configDefaultApprovalPersonMapper.insert(configDefaultApprovalPerson);
        }
        return num;
    }

    /**
     * 根据角色获取人员信息
     * @author liyafeng
     * @date 2022/12/8
      * @param request
     * @return {@link ConfigDefaultApprovalPersonVo}
     */
    @Override
    public ConfigDefaultUserInfoVo getConfigDefaultApprovalPersonVo(ConfigDefaultUserInfoRequest request) {
        ConfigDefaultUserInfoVo vo=new ConfigDefaultUserInfoVo();
        Map<String,Object> paramMap=new HashMap<>();
        paramMap.put("orgCode",request.getOrgCode());
        paramMap.put("roleId",request.getRoleId());
        List<ConfigDefaultUserInfo> configDefaultUserInfos=configDefaultApprovalPersonMapper.selectConfigDefaultUserInfoVo(paramMap);
        vo.setConfigDefaultUserInfos(configDefaultUserInfos);
        return vo;
    }
    /**
     * 根据单位编码获取所有审批角色
     * @author liyafeng
     * @date 2022/12/11
      * @param request
     * @return {@link ConfigAllRoleInfoVo}
     */
    @Override
    public ConfigAllRoleInfoVo getAllRoleInfo(ConfigAllRoleInfoRequest request) {
        ConfigAllRoleInfoVo vo=new ConfigAllRoleInfoVo();
        List<ConfigAllRoleInfo> configAllRoleInfos=configApprovalFlowAutoMapper.selectAllRoleInfo(request.getOrgCode(),request.getTerritoryCode());
        for (ConfigAllRoleInfo configAllRoleInfo:configAllRoleInfos) {
            Map<String,Object> paramMap=new HashMap<>();
            paramMap.put("orgCode",request.getOrgCode());
            paramMap.put("roleId",configAllRoleInfo.getRoleId());
            List<ConfigDefaultUserInfo> configDefaultUserInfos=configDefaultApprovalPersonMapper.selectConfigDefaultUserInfoVo(paramMap);
            configAllRoleInfo.setConfigDefaultUserInfos(configDefaultUserInfos);
        }
        vo.setConfigAllRoleInfos(configAllRoleInfos);
        return vo;
    }
    /**
     * 获取默认审批人
     * @author liyafeng
     * @date 2022/12/11
      * @param caseMainInfo
     * @param roleId
     * @return {@link NextAuditUserVo}
     */
    @Override
    public NextAuditUserVo getNextAuditUserVo(CaseMainInfo caseMainInfo, String  roleId,String documentCatalogCode) {
        String orgCode=caseMainInfo.getCaseOrgCode();
        String deptCode=caseMainInfo.getCaseDeptCode();
        String territoryCode=caseMainInfo.getCaseTerritoryCode();
        Map<String,Object> paramMap=new HashMap<>();
        boolean isAutoApproval=false;
        paramMap.put("orgCode",orgCode);
        paramMap.put("territoryCode",territoryCode);
        paramMap.put("roleId",roleId);
        paramMap.put("documentCatalogCode",documentCatalogCode);
        String autoTime="";
        List<ConfigDocumentApprovalFlowAuto> configDocumentApprovalFlowAutos=configDocumentApprovalFlowAutoMapper.selectConfigDocumentApprovalFlowAutos(paramMap);
        if(!ObjectUtils.isEmpty(configDocumentApprovalFlowAutos)){
            isAutoApproval=true;
            autoTime=configDocumentApprovalFlowAutos.get(0).getAutoTime();
        }
        List<ConfigDefaultApprovalPerson>  configDefaultApprovalPersonList=new ArrayList<>();
        Example example=new Example(ConfigDefaultApprovalPerson.class);
        example.createCriteria().andEqualTo("orgCode",orgCode).andEqualTo("deptCode",deptCode);
        configDefaultApprovalPersonList=configDefaultApprovalPersonMapper.selectByExample(example);
        if(ObjectUtils.isEmpty(configDefaultApprovalPersonList)){
            Example orgExample=new Example(ConfigDefaultApprovalPerson.class);
            orgExample.createCriteria().andEqualTo("orgCode",orgCode);
            configDefaultApprovalPersonList=configDefaultApprovalPersonMapper.selectByExample(orgExample);
        }
        if(!ObjectUtils.isEmpty(configDefaultApprovalPersonList)){
            String approvalDefaultConfig=configDefaultApprovalPersonList.get(0).getApprovalDefaultConfig();
            List<ConfigAllRoleUserInfo> configAllRoleUserInfos = JSONArray.parseArray(approvalDefaultConfig, ConfigAllRoleUserInfo.class);
            NextAuditUserVo vo=new NextAuditUserVo();
            for (ConfigAllRoleUserInfo configAllRoleUserInfo:configAllRoleUserInfos) {
                if(roleId.equals(configAllRoleUserInfo.getRoleId())){
                    if(StringUtils.isBlank(configAllRoleUserInfo.getDefaultApprovalUserId())){
                        return null;
                    }
                    if(isAutoApproval){
                        vo.setIsAutoApproval(Constant.STRING_1);
                    }else{
                        vo.setIsAutoApproval(Constant.STRING_0);
                    }
                    vo.setRealName(configAllRoleUserInfo.getDefaultApprovalUserName());
                    vo.setUserId(configAllRoleUserInfo.getDefaultApprovalUserId());
                    vo.setApprovalRoleName(configAllRoleUserInfo.getRoleName());
                    vo.setAutoTime(autoTime);
                    break;
                }
            }
            return vo;
        }
        return null;
    }
}